This family of functions generates pseudo-random numbers using the well-
known linear congruential algorithm and 48-bit integer arithmetic.
Functions _dddd_rrrr_aaaa_nnnn_dddd_4444_8888 and _eeee_rrrr_aaaa_nnnn_dddd_4444_8888 return non-negative double-precision
floating-point values uniformly distributed over the interval [0.0,~1.0).
Functions _llll_rrrr_aaaa_nnnn_dddd_4444_8888 and _nnnn_rrrr_aaaa_nnnn_dddd_4444_8888 return non-negative long integers uniformly
distributed over the
interval [0,~2).
Functions _mmmm_rrrr_aaaa_nnnn_dddd_4444_8888 and _jjjj_rrrr_aaaa_nnnn_dddd_4444_8888 return signed long integers uniformly
distributed over the interval
[-2,~2).
Functions _ssss_rrrr_aaaa_nnnn_dddd_4444_8888, _ssss_eeee_eeee_dddd_4444_8888, and _llll_cccc_oooo_nnnn_gggg_4444_8888 are initialization entry points,
one of which should be invoked before either _dddd_rrrr_aaaa_nnnn_dddd_4444_8888, _llll_rrrr_aaaa_nnnn_dddd_4444_8888, or _mmmm_rrrr_aaaa_nnnn_dddd_4444_8888
is called. (Although it is not recommended practice, constant default
initializer values will be supplied automatically if _dddd_rrrr_aaaa_nnnn_dddd_4444_8888, _llll_rrrr_aaaa_nnnn_dddd_4444_8888, or
_mmmm_rrrr_aaaa_nnnn_dddd_4444_8888 is called without a prior call to an initialization entry point.)
Functions _eeee_rrrr_aaaa_nnnn_dddd_4444_8888, _nnnn_rrrr_aaaa_nnnn_dddd_4444_8888, and _jjjj_rrrr_aaaa_nnnn_dddd_4444_8888 do not require an initialization
All the routines work by generating a sequence of 48-bit integer values,
Xi, according to the linear congruential formula
Xn+1 = (aXn+c)mod m n_>0.
The parameter m=2 hence 48-bit integer arithmetic is performed.
Unless _llll_cccc_oooo_nnnn_gggg_4444_8888 has been invoked, the multiplier value a and the addend
value c are given by
a = 5DEECE66D = 273673163155
c = B = 13.
The value returned by any of the functions _dddd_rrrr_aaaa_nnnn_dddd_4444_8888, _eeee_rrrr_aaaa_nnnn_dddd_4444_8888, _llll_rrrr_aaaa_nnnn_dddd_4444_8888,
_nnnn_rrrr_aaaa_nnnn_dddd_4444_8888, _mmmm_rrrr_aaaa_nnnn_dddd_4444_8888, or _jjjj_rrrr_aaaa_nnnn_dddd_4444_8888 is computed by first generating the next
48-bit Xi in the sequence. Then the appropriate number of bits,
according to the type of
data item to be returned, are copied from the high-order (leftmost) bits
of Xi and transformed into the returned value.
The functions _dddd_rrrr_aaaa_nnnn_dddd_4444_8888, _llll_rrrr_aaaa_nnnn_dddd_4444_8888, and _mmmm_rrrr_aaaa_nnnn_dddd_4444_8888 store the last 48-bit Xi
generated in an internal buffer. Xi must be initialized prior to being
invoked. The functions _eeee_rrrr_aaaa_nnnn_dddd_4444_8888, _nnnn_rrrr_aaaa_nnnn_dddd_4444_8888, and _jjjj_rrrr_aaaa_nnnn_dddd_4444_8888 require the calling
program to provide storage for the successive Xi values in the array
specified as an argument when the functions are invoked. These routines
do not have to be initialized; the calling program must place the desired
initial value of Xi into the array and pass it as an argument. By using
different arguments, functions _eeee_rrrr_aaaa_nnnn_dddd_4444_8888, _nnnn_rrrr_aaaa_nnnn_dddd_4444_8888, and _jjjj_rrrr_aaaa_nnnn_dddd_4444_8888 allow
separate modules of a large program to generate several _i_n_d_e_p_e_n_d_e_n_t
streams of pseudo-random numbers, i.e., the sequence of numbers in each
stream will _n_o_t depend upon how many times the routines have been called
to generate numbers for the other streams.
The initializer function _ssss_rrrr_aaaa_nnnn_dddd_4444_8888 sets the high-order 32 bits of Xi to the
32 bits contained in its argument. The low-order 16 bits of Xi are set
to the arbitrary value 330E.
The initializer function _ssss_eeee_eeee_dddd_4444_8888 sets the value of Xi to the 48-bit value
specified in the argument array. In addition, the previous value of Xi
is copied into a 48-bit internal buffer, used only by _ssss_eeee_eeee_dddd_4444_8888, and a
pointer to this buffer is the value returned by _ssss_eeee_eeee_dddd_4444_8888. This returned
pointer, which can just be ignored if not needed, is useful if a program
is to be restarted from a given point at some future time - use the
pointer to get at and store the last Xi value, and then use this value to
reinitialize via _ssss_eeee_eeee_dddd_4444_8888 when the program is restarted.
The initialization function _llll_cccc_oooo_nnnn_gggg_4444_8888 allows the user to specify the
initial Xi, the multiplier value a, and the addend value c. Argument
array elements _p_a_r_a_m[_0-_2] specify Xi, _p_a_r_a_m[_3-_5] specify the multiplier
a, and _p_a_r_a_m[_6] specifies the 16-bit addend c. After _llll_cccc_oooo_nnnn_gggg_4444_8888 has been
called, a subsequent call to either _ssss_rrrr_aaaa_nnnn_dddd_4444_8888 or _ssss_eeee_eeee_dddd_4444_8888 will restore the
``standard'' multiplier and addend values, a and c, specified on the